\chapter{引数の指定法と型名}
この項では命令の定義の仕方とそれに付随する内容を説明します。

\section{命令名}
全ての命令には\indy{めいれいめい}{命令名}が付きます。命令名とは
それぞれの命令の名前で、命令を区別する為に付けられます。命令名は
命令叙述によって次の規則に従って付けられます。

\begin{enumerate}
 \item {\tt ()} は省略しない形
 \item {\tt []} は最初の項目を使用
 \item {\tt \{\}} は記述されている順序
 \item {\tt *} は削除
 \item {\tt <>} は一回
\end{enumerate}
で求めます。しかし、別途設定することもできます。

例えば、
\begin{lstlisting}
{Aを}{Bに}加算([する/せ/し/すれ/しろ/せよ]*)
\end{lstlisting}
ならば
\begin{lstlisting}
AをBに加算する
\end{lstlisting}
が命令名になります。

\section{命令の定義の方法}
\subsection{スクリプト上で}
Dragon Script 上で命令を定義する場合は、次のようにします。
\begin{lstlisting}
『{Aを}{Bに}加算([する/せ/し/すれ/しろ/せよ]*)』を
引数 「A」は数値
引数 「B」は数値
で命令定義し、その内容は
	(A+B)を返す。
とする。
\end{lstlisting}

これは、
\begin{lstlisting}[showspaces=true]
『命令文[の/を] <引数引数名は 型名([で/で 省略した時は 値])>
[として/で/を] ((命令名)命令の名前[として/で/の] )
(優先度優先度値[として/で/の] )命令定義し(て) その内容は 
関数の内容(と [する/せ/し/す/すれ/せよ/しろ]*)』の
引数「命令文」は文字列
引数「引数名」は文字列
引数「型名」は型名
引数「値」はデュアル
引数「命令の名前」は文字列
引数「優先度値」は整数で省略した時は 1000
引数「関数の内容」はスクリプト
を命令名「命令定義」の優先度1000で命令定義し、その内容は
...(省略)...
とする。
\end{lstlisting}
として定義したものです。実際にはこれでは堂々巡りとなってしまいます
ので、下のプラグイン上での定義によって内部で定義されています。

\subsection{プラグイン上で}
Dragon Script では $\mathrm{C}++$ で記述した内容をプラグインという形で
共有ライブラリとすることで実行することができます。プラグインを作成する時は
libdragonscript.so にリンクすることで作成することができます。スクリプト
からプラグイン内の命令を使用する時に使います。
\begin{lstlisting}[language=c++]
// TODO: 内容を書く
\end{lstlisting}
詳しくはプラグインリファレンスをご覧ください。

\section{型名について}
\index[wordindex]{かためい@型名}
Dragon Script における型は
\begin{enumerate}
  \item システム的なもの
  \item アプリケーション的なもの
\end{enumerate}
の2種類があります。

システム的なものとは、それ自身を見た型をそのまま変数の型としているものを表します。
例えば、文字 {\tt `c'} は文字型、文字列 {\tt ``Hello, World!''} は文字列型です。
{\tt 123} は整数の数値ですし、{\tt 1.234} は実数の数値です。今、ここでは、
{\tt `c'} が何を意味するのか、{\tt ``Hello, World!''} が何を意味するのか、
{\tt 123} が何を意味するのか、{\tt 1.234} が何を意味するのかは考えていません。
そういった意味を考慮すると、システム的なものからアプリケーション的なものへと
変わります。一方でアプリケーション的なものの実体は必ずシステム的なもののうちの
どれかです。

\subsection{システム的なもの}
\index[wordindex]{かためい@型名!しすてむてきな@システム的な ---}
システム的なものには次のようなものがあります。またプラグインによって、追加することも
できます。

\subsubsection{自然数型}
\index[wordindex]{しせんすうかた@自然数型}
正の整数値を扱えます。扱える範囲はシステムにより異なる場合がありますが、大抵は
$0\sim{}4294967296$ です。

\subsubsection{整数型}
\index[wordindex]{せいすうかた@整数型}
整数値を扱えます。扱える範囲はシステムにより異なる場合がありますが、大抵は
$-2147483648\sim{}2147483647$ です。

\subsubsection{長大自然数型}
\index[wordindex]{ちようたいしせんすうかた@長大自然数型}
大きな自然数を扱えます。通常 $0\sim{}18446744073709551616$ まで扱えますが、
システムによっては用意されない場合があります。

\subsubsection{長大整数型}
\index[wordindex]{ちようたいせいすうかた@長大整数型}
大きな整数値を扱えます。通常 $-9223372036854775808\sim{}$\\$9223372036854775807$ まで扱えますが、
システムによっては用意されない場合があります。

\subsubsection{実数型}
\index[wordindex]{しつすうかた@実数型}
実数を扱えます。一般には浮動小数点型と言われるもので、指数部が大きいと、小数部分まで表すことは
できなくなります。扱える範囲はシステムにより異なります。通常、$10^{-307}\sim{}10^{308}$ の範囲を
表すことができ、有効桁数はおよそ 15桁です。

\subsubsection{長大実数型}
\index[wordindex]{ちようたいしつすうかた@長大実数型}
大きな実数を扱えます。システムによっては用意されない場合があります。用意されれば 
$10^{-4931}\sim{}10^{4932}$ の範囲を表すことができ、有効桁数は 18桁になります。
\footnote{Dragon Script は速い言語ではないが、数値計算を考慮し、float に対応する型は用意しない。}

\subsubsection{複素数型}
\index[wordindex]{ふくそすうかた@複素数型}
実部と虚部がそれぞれ実数型となる組み合わさった型です。

\subsubsection{長大複素数型}
\index[wordindex]{ちようたいふくそすうかた@長大複素数型}
実部と虚部がそれぞれ長大実数型となる組み合わさった型です。

\subsubsection{文字型}
\index[wordindex]{もしかた@文字型}
Unicode の BMP 面を表すのに十分な大きさの整数型です。通常は SMP 面も1つで1文字表すことができますが、
システムによっては表すことができない場合があります。なお、SMP 面の文字は表すことができても適切に
表示されない場合がありますのでご了承ください。

\subsubsection{文字列型}
\index[wordindex]{もしれつかた@文字列型}
文字型の配列を扱えます。通常の配列とは異なり、様々な命令が用意されます。

\subsubsection{バイナリ型}
\index[wordindex]{はいなりかた@バイナリ型}
データを1バイトずつ操作する為の型で、$0\sim{}255$ を代入できます。

\subsubsection{バイナリ列型}
\index[wordindex]{はいなりれつかた@バイナリ列型}
バイナリ型の配列を扱えます。通常の配列とは異なり、文字列に近い操作が可能です。文字列型とことなり、
文字コードの変換が行われません。

\subsubsection{デュアル\ または\ 任意の型}
\index[wordindex]{てゆある@デュアル}
\index[wordindex]{にんいのかた@任意の型}
引数の型を指定する時、どのような型であってもよいということを示します。
内部で型が判定され、適切な処理が行われます。

\subsubsection{スクリプト}
\index[wordindex]{すくりふとかためい@スクリプト (型名)}
引数の型を指定する時、インデントされたスクリプトをまるごと受け取るために
使います。

\subsubsection{○○の配列型}
\index[wordindex]{はいれつかた@配列型}
○○には任意の型名を入れて使います。配列を扱います。○○には任意の型名が
入りますので、``○○の配列型の配列型'' とすることで二次元配列を示すことが
できます。配列型の要素の呼び出しには自然数のみが指定できます。配列型では
後ろに要素を追加したり、後ろから要素を削除することしかできません。

\subsubsection{○○のリスト型}
\index[wordindex]{りすとかた@リスト型}
同様に○○には任意の型名を入れます。リストを扱います。配列とはよく似て
いますが、こちらは任意の箇所で追加$\cdot$削除ができます。その代わり、
ランダムにアクセスすることができず、かならず先頭または末尾から順を追って
アクセスしていくことになります。

\subsubsection{○○のデク型\ または\ ○○の双方向キュー型}
\index[wordindex]{てくかた@デク型}
\index[wordindex]{そうほうこうきゆうかた@双方向キュー型}
双方向キューを扱います。先頭または末尾にしか要素の追加または削除ができません。
また、読み出しも先頭または末尾しかできません。

\subsubsection{○○のスタック型}
\index[wordindex]{すたつくかた@スタック型}
デク型を少しわかりやすくしたもので、先頭にしか追加できず、削除も先頭から
削除していきます。アクセスも先頭にしかできません。これはちょうどテニスボール
のケースを想い描いてもらえばよいでしょう。

\subsubsection{○○のキュー型}
\index[wordindex]{きゆうかた@キュー型}
スタック型と異なり、末尾にしか追加できなくしたものです。アクセスや削除は
先頭からになります。これはちょうどレジ待ちを想い描いてもらえばよいでしょう。

\subsubsection{○○の△(を)優先(する)キュー型}
\index[wordindex]{ゆうせんきゆうがた@優先キュー型}
基本的にはキュー型と同じですが、追加した時に、追加した値が大きい順または
小さい順、あるいは指定した値を先にするような並び替えを行います。例えば、
\begin{lstlisting}
キューサンプルは整数型の大優先キュー型。
キューサンプルに3を追加。
キューサンプルに6を追加。
キューサンプルから取り出して表示。 #=> 6
キューサンプルに2を追加。
キューサンプルから取り出して表示。 #=> 3
\end{lstlisting}
のような挙動をとります。

\subsubsection{○○と△△の連想配列型\ または\ ○○と△△のハッシュ型}
\index[wordindex]{れんそうはいれつかた@連想配列型}
\index[wordindex]{はつしゆかた@ハッシュ型}
○○と△△には両方とも型名を入れます。
連想配列とは配列では数値とデータを関連づけるものだったのですが、連想配列では
キーと呼ばれるデータと値と呼ばれるデータを関連づけることができます。例えば、
\begin{lstlisting}
### 初期化
型名品名は文字列型。
型名売上げは自然数型で単位は個。
売上げ情報は品名と売上げの連想配列型。
売上げ情報に「携帯電話」と0個を挿入。
売上げ情報に「電子辞書」と0個を挿入。

### もし品物が売れたら
売り上げ情報の「携帯電話」に1個加算する。

### サマリーを表示する
売上げ情報のすべてについて、
    「{そのキー}が{その値}個売れました。」と言え。
\end{lstlisting}
携帯電話の売れた個数や電子辞書の売れた個数などと個別に変数を作るよりも
ずいぶんプログラムがスマートに見えることでしょう。

\subsubsection{○○と△△の重複可能連想配列型\ または\ ○○と△△の重複可能ハッシュ型}
\index[wordindex]{ちようふくかのうれんそうはいれつかた@重複可能連想配列型}
\index[wordindex]{ちようふくかのうはつしゆかた@重複可能ハッシュ型}
通常の連想配列型と異なるのは、キーデータがおなじ物を複数登録できるか、ということにあります。
名前の通り、連想配列型ではできず、重複可能連想配列型では重複登録できるということです。
連想配列型ではおなじキーの物を挿入しようとすると「重複登録です」と警告され、上書きされます。
重複可能連想配列型では重複登録できますので、警告はでず、新たなエントリが作成され、キーと
値のペアを保存できます。しかし、複数のキーが存在するということは、キーを使ったアクセスは
できなくなることがわかります。

\subsubsection{○○のセット型}
\index[wordindex]{せつとかた@セット型}
連想配列型の値のほうが無くなってキーのみを管理する型です。これはよくキーが存在するかどうか
だけの情報があればよい場合に使われます。

\subsubsection{○○の重複可能セット型}
\index[wordindex]{ちようふくかのうせつとかた@重複可能セット型}
これもセット型のキー重複を許可したバージョンです。

\subsubsection{その他}
プラグインを読み込むとこれ以外にも定義されるものがあります。

\subsection{アプリケーション的なもの}
\index[wordindex]{かためい@型名!あふりけいしよんてきな ---@アプリケーション的な ---}
アプリケーション的な型名は用途ごとに型を分けるということでプログラムの間違いを減らそう
という目的で存在します。例えば、
\begin{lstlisting}[name=dollar]
型名ドルは実数型で単位はドル。
型名円は実数型で単位は円。
\end{lstlisting}
を定義した時、
\begin{lstlisting}[name=dollar]
合計金額は、100ドル+2000円。
\end{lstlisting}
をエラーにすることができます。またエラーにする代わりに自動的に貨幣兌換が行えるようにも
できます。
\begin{lstlisting}
型名ドルは実数型で単位はドル。
型名円は実数型で単位は円。
ドルから円への変換は、
    ドル*100を返す。

合計金額は、100ドル+2000円。 #=> 12000円
\end{lstlisting}

また単位が無かったり同じでも、型の異なる物へは代入できません。
\begin{lstlisting}
型名絶対座標は整数型。
型名相対座標は整数型。

AXは絶対座標。
ZXは相対座標。
RXは相対座標。
AX=40。
RX=100。
ZX=AX+RX。 #=> `絶対座標' は `相対座標' に変換できません。
\end{lstlisting}
ただし、例で見ても分かるように単位のない定数は型の制約を受けません。

一方でシステム的な型名で定義された物に対しては常に代入できます。
\begin{lstlisting}
型名絶対座標は整数型。
型名相対座標は整数型。

AXは絶対座標。
ZXは整数型。
RXは相対座標。
AX=40。
ZX=AX。
RX=ZX。 #=> 40
\end{lstlisting}

\subsubsection{物理次元}
\index[commindex]{かためいふつりしけん@型名 --- は --- の物理次元}
物理次元命令は物理的な型名を定義する為に存在します。システム的な型名は
通常は実数型、使える場合は長大実数型を使用するため、システム的な型名を
指示しなくて済みます。
\begin{lstlisting}
型名位置は「L」の物理次元。
型名速度は「LT-1」の物理次元。
型名時間は「T」の物理次元。

tは時間。
vは速度。
xは位置。
v=x/t。 #=> OK
x=v*t。 #=> OK
t=x*v。 #=> NG (エラーになる)
\end{lstlisting}
次元は表\ref{physical_dimension}の通りです。数値部分を省略した場合は 1 と見な
します。
\begin{table}
\caption{物理次元の定義と例}
\label{physical_dimension}
\centering
\begin{tabular}{c|c|c c}
 \hline
 量 & 単位例 & 次元 & 由来\\
 \hline
 長さ & $\mathrm{m}$ & {\tt L} & Length \\
 質量 & $\mathrm{kg}$ & {\tt M} & Mass \\
 時間 & 秒 & {\tt T} & Time \\
 電流 & $\mathrm{A}$ & {\tt C} & Current \\
 温度 & $\mathrm{K}$ & {\tt K} & Kelvin \\
 光度 & $\mathrm{cd}$ & {\tt cd} & CanDela \\
 物質量 & $\mathrm{mol}$ & {\tt N} & Number \\
 \hline
 周波数 & $\mathrm{Hz}$ & {\tt S-1} \\
 エネルギー & $\mathrm{J}$ & {\tt L2MS-2} \\
 工率 & $\mathrm{J/s}$ & {\tt L2MS-3} \\
 電荷 & $\mathrm{C}$ & {\tt CS} \\
 力 & $\mathrm{N}$ & {\tt MLS-2} \\
 圧力 & $\mathrm{N/m}^2$ & {\tt M-1LS-2} \\
 電圧 & $\mathrm{V}$ & {\tt L2MS-3C-1} \\
 \hline
\end{tabular}
\end{table}

なお、このような機能を用意する(予定です)が、もう一度 Dragon Script は
数値の計算には向かないであろうということだけは注意してください。
